package main

import (
	"fmt"
	"reflect"
)

// 指针用来指向一块内存地址

// 声明指针
func probe1() {
	// 创建一块内存， 这块内存固定会指向一个固定的内存地址(0x0)， 内存地址(0x0)里面的值是nil
	// 这样定义的指针都会指向同一块内存地址
	// nil指go语言中的空值
	var (
		v1 *int
		v2 *int
		v3 *int
	)
	fmt.Printf("v1: %p, v2: %p, v3: %p\n", v1, v2, v3)
	fmt.Printf("v1: %d, v2: %d, v3: %d\n", *v1, *v2, *v3)
	fmt.Println(reflect.TypeOf(v1))
	// 优先创建一块内存， 并且不会存int的初始值， 但会存储另一个内存地址(0x111)
	// 另一个内存地址(0x111)里面存的是 int的初始值
	// new的作用是 创建一块内存并初始化内部数据， 并返回指针类型
	v4 := new(int)
	fmt.Println(v4)
}

// 指针的意义
// 指针的目的是用来节省内存的
func probe2() {
	var v1 string = "name"
	var v2 *string = &v1

	// 使用 &获取内存地址， 使用*获取指针指向的值
	fmt.Printf("v1:%p ", &v1)
	fmt.Println(v1, v2, *v2)

	v1 = "djr"
	fmt.Printf("v1:%p ", &v1)
	fmt.Println(v1, v2, *v2)
}
